package com.wu.wechat.util;

/**
 * @Author Create by wuyanshen
 * @Date 2018-08-07 上午10:38
 * @Description <描述>
 */


import com.wu.wechat.common.Constant;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * 验证签名
 *
 */
public class SignUtil {

        /**
         * 验证签名
         * @param signature 签名用来核实最后的结果是否一致
         * @param timestamp 时间标记
         * @param nonce 随机数字标记
         * @return 一个布尔值确定最后加密得到的是否与signature一致
         */
        public static boolean checkSignature(String signature, String timestamp, String nonce) {
            //将传入参数变成一个String数组然后进行字典排序
            String[] arr = new String[] { Constant.TOKEN, timestamp, nonce };
            // 将token、timestamp、nonce三个参数进行字典排序
            Arrays.sort(arr);
            //创建一个对象储存排序后三个String的结合体
            StringBuilder content = new StringBuilder();
            for (int i = 0; i < arr.length; i++) {
                content.append(arr[i]);
            }

            //启动sha1加密法的工具
            MessageDigest md = null;
            String tmpStr = null;

            try {
                md = MessageDigest.getInstance("SHA-1");
                // 将三个参数字符串拼接成一个字符串进行sha1加密
                //md.digest()方法必须作用于字节数组
                byte[] digest = md.digest(content.toString().getBytes());
                //将字节数组弄成字符串
                tmpStr = byteToStr(digest);
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
            }

            content = null;
            // 将sha1加密后的字符串可与signature对比
            return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
        }

        /**
         * 将字节数组转换为十六进制字符串
         *
         * @param byteArray
         * @return
         */
        private static String byteToStr(byte[] byteArray) {
            String strDigest = "";
            for (int i = 0; i < byteArray.length; i++) {
                strDigest += byteToHexStr(byteArray[i]);
            }
            return strDigest;
        }

        /**
         * 将每一个字节转换为十六进制字符串
         *
         * @param mByte
         * @return
         */
        private static String byteToHexStr(byte mByte) {
            //转位数参照表
            char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
            char[] tempArr = new char[2];
            tempArr[0] = Digit[(mByte >>> 4) & 0X0F];//XXXX&1111那么得到的还是XXXX
            tempArr[1] = Digit[mByte & 0X0F];//XXXX&1111那么得到的还是XXXX

            //得到进制码的字符串
            String s = new String(tempArr);
            return s;
        }

}
